AWS Systems Manager Session Managerのアクティビティログを出力してみた
Session ManagerでEC2にアクセスした際の操作ログを出力する設定があるのでやってみました。
やること
ざっくりとやることは以下の3点です。
- ログ保管用S3の作成
- ログ記録設定
- EC2のIAMロールにS3へのアクセス権限を付与
Session Managerでの操作ログはCloudWatch Logsに出力するかS3に出力することができます。
セッションアクティビティのログ記録
今回はS3への出力を設定してみました。
設定
ログ保管用S3の作成
ログ保管用S3はCloudFormationを利用して作成しました。
使用したテンプレートは以下になります。
AWSTemplateFormatVersion: "2010-09-09" Description: S3 Stack Resources: # ------------------------------------------------------------# # S3 # ------------------------------------------------------------# S3: Type: AWS::S3::Bucket Properties: BucketEncryption: ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: SSEAlgorithm: AES256 BucketName: !Sub ${AWS::StackName}-${AWS::AccountId} PublicAccessBlockConfiguration: BlockPublicAcls: True BlockPublicPolicy: True IgnorePublicAcls: True RestrictPublicBuckets: True
公式ドキュメントにも記載されている通りログ保管用のS3は暗号化されている必要があるため21行目で暗号化設定をしています。
テンプレートファイルを作成したら以下のコマンドでS3を作成します。
aws cloudformation create-stack --stack-name スタック名 --template-body file://CloudFormationテンプレートファイル名
実行すると暗号化が有効になったS3が1つ作成されます。
ログ記録設定
ログ記録設定は以下の公式ドキュメントの通り設定します。
Amazon S3 を使用してセッションデータをログ記録する (コンソール)
マネジメントコンソールからSystems Managerのダッシュボードへ移動します。
移動後、左の項目から「セッションマネージャー」をクリックします。
画面が遷移したら「設定」をクリックします。
画面が遷移したら「編集」をクリックします。
「編集」をクリックすると設定変更ができるようになるので「S3 logging」欄で「Enable」にチェックを行い、出力先S3バケットの設定をします。
選択するS3バケットは上記項目で作成したS3を選択してください。
EC2のIAMロールにS3へのアクセス権限を付与
こちらの設定を行わないとSession Managerでの接続時に以下のエラーが発生します。
セッションが次の理由で終了されました。 Couldn't start the session because we are unable to validate encryption on Amazon S3 bucket. Error: AccessDenied: Access Denied status code: 403, request id:...
作成するポリシーは以下のものになります。
以下のポリシーは公式ドキュメントを参考に作成しました。
Session Manager、Amazon S3、CloudWatch Logs (コンソール) の許可を持つIAM ロールの作成
公式ドキュメントではSession Manager、CloudWatch Logsに必要なアクションがついていましたが、今回Session ManagerにはAmazonSSMManagedInstanceCoreというマネージドポリシーを利用するので削除しています。
CloudWatch Logsについては利用しないので削除しました。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "S3バケットのARN/*" }, { "Effect": "Allow", "Action": [ "s3:GetEncryptionConfiguration" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": "KMSキーのARN" }, { "Effect": "Allow", "Action": "kms:GenerateDataKey", "Resource": "*" } ] }
EC2に設定するIAMロールをCloudFormationテンプレートにすると以下のようになります。
AWSTemplateFormatVersion: "2010-09-09" Description: IAM Stack Resources: # ------------------------------------------------------------# # IAM # ------------------------------------------------------------# IamRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: - ec2.amazonaws.com Action: - 'sts:AssumeRole' ManagedPolicyArns: - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore RoleName: EC2Role IamPolicy: Type: AWS::IAM::Policy Properties: PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - "s3:PutObject" Resource: - "S3バケットARN/*" - Effect: Allow Action: - "s3:GetEncryptionConfiguration" Resource: "*" - Effect: Allow Action: - "kms:Decrypt" Resource: "KMSキーARN" - Effect: Allow Action: - "kms:GenerateDataKey" Resource: "*" PolicyName: PutObject Roles: - EC2Role DependsOn: IamRole IamInstanceProfile: Type: AWS::IAM::InstanceProfile Properties: InstanceProfileName: EC2Role Roles: - !Ref IamRole
CloudFormation実行コマンドは以下のようになります。
aws cloudformation create-stack --stack-name スタック名 --template-body file://CloudFormationテンプレートファイル名 --capabilities CAPABILITY_NAMED_IAM
ログ出力確認
上記項目の設定が完了したらEC2にSession Managerでアクセスして操作した後にS3にログが出力されることを確認します。
EC2上で操作を行いしばらく待つとS3にログが出力されていることが確認できました。
さいごに
操作ログを残すのは重要なのでこういった設定は利用できる場合は利用する方が良いと思いました。